/*
* Copyright: JessMA Open Source (ldcsaa@gmail.com)
*
* Version : 3.2.3
* Author : Bruce Liang
* Website : http://www.jessma.org
* Project : https://github.com/ldcsaa
* Blog : http://www.cnblogs.com/ldcsaa
* Wiki : http://www.oschina.net/p/hp-socket
* QQ Group : 75375912
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jessma.hpsocket.unicode;
import org.jessma.hpsocket.Buffer;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.WString;
/** TCP Server 组件基类 (Unicode) */
public class TcpServer extends Server
{
/** 创建组件对象 */
public static TcpServer create(Mode mode)
{
TcpServer instance = new TcpServer();
instance.mode = mode;
switch(mode)
{
case PUSH:
instance.socketListener = HPSocket.SDK.Create_HP_TcpServerListener();
instance.socketObj = HPSocket.SDK.Create_HP_TcpServer(instance.socketListener);
break;
case PULL:
instance.socketListener = HPSocket.SDK.Create_HP_TcpPullServerListener();
instance.socketObj = HPSocket.SDK.Create_HP_TcpPullServer(instance.socketListener);
break;
default:
assert false;
}
return instance;
}
/** 销毁组件对象 */
public static void destroy(TcpServer server)
{
if(server.socketObj == null && server.socketListener == null)
return;
synchronized(server)
{
switch(server.mode)
{
case PUSH:
if(server.socketObj != null)
HPSocket.SDK.Destroy_HP_TcpServer(server.socketObj);
if(server.socketListener != null)
HPSocket.SDK.Destroy_HP_TcpServerListener(server.socketListener);
break;
case PULL:
if(server.socketObj != null)
HPSocket.SDK.Destroy_HP_TcpPullServer(server.socketObj);
if(server.socketListener != null)
HPSocket.SDK.Destroy_HP_TcpPullServerListener(server.socketListener);
break;
default:
assert false;
}
server.clearReferences();
}
}
protected TcpServer()
{
}
@Override
protected void finalize() throws Throwable
{
destroy(this);
super.finalize();
}
/* ********************************* TCP Server 组件操作方法 ****************************** */
/** 发送小文件 */
public boolean sendSmallFile(NativeLong dwConnID, String lpszFileName, byte[] pHead, byte[] pTail)
{
Buffer headBuffer = pHead != null ? new Buffer(pHead) : null;
Buffer tailBuffer = pTail != null ? new Buffer(pTail) : null;
return sendSmallFile(dwConnID, lpszFileName, headBuffer, tailBuffer);
}
/** 发送小文件 */
public boolean sendSmallFile(NativeLong dwConnID, String lpszFileName, Buffer pHead, Buffer pTail)
{
long pMemHead = 0;
long pMemTail = 0;
Pointer pHeadBuffer = null;
Pointer pTailBuffer = null;
if(pHead != null)
{
pMemHead = Native.malloc(Buffer.NATIVE_BUFFER_SIZE);
pHeadBuffer = new Pointer(pMemHead);
pHeadBuffer.setInt(0, pHead.getLength());
pHeadBuffer.setPointer(Pointer.SIZE, pHead.getPointer());
}
if(pTail != null)
{
pMemTail = Native.malloc(Buffer.NATIVE_BUFFER_SIZE);
pTailBuffer = new Pointer(pMemTail);
pTailBuffer.setInt(0, pTail.getLength());
pTailBuffer.setPointer(Pointer.SIZE, pTail.getPointer());
}
WString lpwszFileName = lpszFileName != null ? new WString(lpszFileName) : null;
boolean result = HPSocket.SDK.HP_TcpServer_SendSmallFile(socketObj, dwConnID, lpwszFileName, pHeadBuffer, pTailBuffer);
if(pMemHead != 0) Native.free(pMemHead);
if(pMemTail != 0) Native.free(pMemTail);
return result;
}
/* ****************************** TCP Server 属性访问方法 ******************************** */
/** 设置 Accept 预投递数量(根据负载调整设置,Accept 预投递数量越大则支持的并发连接请求越多) */
public void setAcceptSocketCount(int dwAcceptSocketCount)
{
HPSocket.SDK.HP_TcpServer_SetAcceptSocketCount(socketObj, dwAcceptSocketCount);
}
/** 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
public void setSocketBufferSize(int dwSocketBufferSize)
{
HPSocket.SDK.HP_TcpServer_SetSocketBufferSize(socketObj, dwSocketBufferSize);
}
/** 设置监听 Socket 的等候队列大小(根据并发连接数量调整设置) */
public void setSocketListenQueue(int dwSocketListenQueue)
{
HPSocket.SDK.HP_TcpServer_SetSocketListenQueue(socketObj, dwSocketListenQueue);
}
/** 设置心跳包间隔(毫秒,0 则不发送心跳包) */
public void setKeepAliveTime(int dwKeepAliveTime)
{
HPSocket.SDK.HP_TcpServer_SetKeepAliveTime(socketObj, dwKeepAliveTime);
}
/** 设置心跳确认包检测间隔(毫秒,0 不发送心跳包,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
public void setKeepAliveInterval(int dwKeepAliveInterval)
{
HPSocket.SDK.HP_TcpServer_SetKeepAliveInterval(socketObj, dwKeepAliveInterval);
}
/** 获取 Accept 预投递数量 */
public int getAcceptSocketCount()
{
return HPSocket.SDK.HP_TcpServer_GetAcceptSocketCount(socketObj);
}
/** 获取通信数据缓冲区大小 */
public int getSocketBufferSize()
{
return HPSocket.SDK.HP_TcpServer_GetSocketBufferSize(socketObj);
}
/** 获取监听 Socket 的等候队列大小 */
public int getSocketListenQueue()
{
return HPSocket.SDK.HP_TcpServer_GetSocketListenQueue(socketObj);
}
/** 获取心跳检查次数 */
public int getKeepAliveTime()
{
return HPSocket.SDK.HP_TcpServer_GetKeepAliveTime(socketObj);
}
/** 获取心跳检查间隔 */
public int getKeepAliveInterval()
{
return HPSocket.SDK.HP_TcpServer_GetKeepAliveInterval(socketObj);
}
/* ***************************** TCP Pull Server 组件操作方法 **************************** */
/**
* 抓取数据
*/
public int fetch(NativeLong dwConnID, byte[] pBuffer, int iLength)
{
return HPSocket.SDK.HP_TcpPullServer_Fetch(socketObj, dwConnID, pBuffer, iLength);
}
}